# spiking-network-evolution
Небольшой pet-project.

Есть метод [HyperNEAT](https://en.wikipedia.org/wiki/HyperNEAT) для построения генетического алгоритма, умеющего эволюционировать нейронную сеть, а точнее [CPPN](https://en.wikipedia.org/wiki/Compositional_pattern-producing_network) (compositional pattern-producing network), способную генерировать нейронную сеть.
С другой стороны, есть [Spiking Neural Network](https://en.wikipedia.org/wiki/Spiking_neural_network) (нейронная сеть, максимально близко моделирующая реальную биологическую нейронную сеть), основанная на [модели](https://en.wikipedia.org/wiki/Biological_neuron_model#Hodgkin–Huxley) биологического нейрона (ещё, классно описано во тут https://neuronaldynamics.epfl.ch/online/).

Этот проект - песочница, где я (время от времени) пытаюсь "подружить" эти 2 алгоритма.

Цель? Just for fun :) Нравится мне почему-то иногда заниматься какой-то мутной математикой и прочей ерундой.

В целом общая долгосрочная идея, чего я хочу добиться, такая: 
1. Я придумываю произвольную задачу.
Например, есть машинка, которая едет по плоскости.
Есть возможность поворачивать руль и прибавлять/убавлять скорость.
Машинка может каким-то образом получать информацию о том, что впереди: препятствие или контрольная точка.
Цель машинки - проехать через набор контрольных точек за наименьшее время.

2. Машинкой управляет нейронная сеть.
В каждый момент времени в нейронную сетку подаются входные сигналы,
а на выходе получаем сигналы управления этой машинкой.

3. Запускаем HyperNEAT алгоритм, задача которого подобрать какую-то структуру и веса нейронной сетки, на которой полученная машина сможет максимально справиться со случайно сгенерирированной задачей.

4. Берём "лучшую" полученную нейросетку, запускаем в абсолютно новых для неё условиях (руками расставляем препятствия и контрольные точки) и смотрим, как она справляется с задачей.

Понятно, вместо машинки может быть что угодно, вместо задачи прохождения по трассе - тоже что угодно (умный робот пылесос - чем не идея применения? А можно поиграть с коллаборацией нескольких роботов, которые пытаются помочь друг другу решить общую задачу).

В чём-то это напоминает естественную эволюцию, в ходе которой у живых существ как-то возникли мозги, хотя никто явно им не рассказывал, в чём задача и как конкретно должен быть устроен их мозг.


Качество кода: сейчас исключительно уровень POC и песочницы. Просто быстрый, местами неструктурированный и с хардкодом прототип.
Но ничего не мешает порефакторить и всё будет красиво!
